pandas绘图详细教程
进入正文
1.1
前面讲过matplotlib的相关教程,matplotlib虽然功能强大,但是matplotlib相对而言较为底层,画图时步骤较为繁琐,比较麻烦,因为要画一张完整的图表,需要实现很多的基本组件,比如图像类型、刻度、标题、图例、注解等等。目前有很多的开源框架所实现的绘图功能是基于matplotlib的,pandas便是其中之一,对于pandas数据,直接使用pandas本身实现的绘图方法比matplotlib更加方便简单。
pandas的两类基本数据结构series和dataframe都提供了一个统一的接口plot(),该函数的定义如下所示:我们经常看见这样的操作方式,比如 df.plot()或者是series.plot()当我们查看该函数的定义的时候却查不到,这是为什么呢?plot的本质又是什么呢?
2.1
plot=CachedAccessor("plot",gfx.SeriesPlotMethods)
plot本质上是一个SeriesPlotMethods类型的一个对象,而为什么可以直接调用plot()呢,是因为SeriesPlotMethods类实现了对象调用的方法__call__(),查看定义可得:
class SeriesPlotMethods(BasePlotMethods):
"""Series plotting accessor and method
Examples
--------
>>> s.plot.line()
>>> s.plot.bar()
>>> s.plot.hist()
Plotting methods can also be accessed by calling the accessor as a method
with the ``kind`` argument:
``s.plot(kind='line')`` is equivalent to ``s.plot.line()``
"""
def __call__(self, kind='line', ax=None,
figsize=None, use_index=True, title=None, grid=None,
legend=False, style=None, logx=False, logy=False,
loglog=False, xticks=None, yticks=None,
xlim=None, ylim=None,
rot=None, fontsize=None, colormap=None, table=False,
yerr=None, xerr=None,
label=None, secondary_y=False, **kwds):
return plot_series(self._data, kind=kind, ax=ax, figsize=figsize,
use_index=use_index, title=title, grid=grid,
legend=legend, style=style, logx=logx, logy=logy,
loglog=loglog, xticks=xticks, yticks=yticks,
xlim=xlim, ylim=ylim, rot=rot, fontsize=fontsize,
colormap=colormap, table=table, yerr=yerr,
xerr=xerr, label=label, secondary_y=secondary_y,
**kwds)
--------
kind:画图的种类,可以是 line(默认),
‘bar’ or ‘barh’ for bar plots,bar表示垂直柱状图,barh表示水平柱状图
‘hist’ for histogram
‘box’ for boxplot
‘kde’ or ‘density’ for density plots。即Kernel Density Estimate 和密度估计,常常与hist一起混合使用。
‘area’ for area plots
‘scatter’ for scatter plots
‘hexbin’ for hexagonal bin plots
‘pie’ for pie plots
ax:要在其上进行绘制的matplotlib.subplot对象,如果没有,则使用默认的subplot对象。
figsize:图像尺寸
use_index:True(默认),False。表示默认情况下,会将series和dataframe的index传给matplotlib,用已绘制X轴。
title:标题
grid:网格
legend:图例
style,绘图的风格,如‘ko--’
logx:在X轴上使用对数标尺
logy: 在Y轴上使用对数标尺
loglog:
xticks=None,用做x刻度的值
yticks=None,用做Y轴刻度的值
xlim=None, X轴的界限如【0,10】
ylim=None,Y轴的界限
rot=None, 旋转刻度标签 0-360
fontsize=None,
colormap=None,
table=False,
yerr=None,
xerr=None,
label=None,
secondary_y=False, **kwds):
---------------------------------------------------------------------------------------------------------------------
下面几个是DataFrame特有的
sharex: 共用X轴
sharey:
---------------------
本节总结
总结:上面只是一些基本的图像参数设置,再具体绘制每一种图形的时候,还有具体对应的相关设置,这里就不一一列举了,在实际的图像中遇到了在进行讲解。
2.2
plot = CachedAccessor("plot", gfx.FramePlotMethods)
plot本质上是一个FramePlotMethods类型的一个对象,而为什么可以直接调用plot()呢,是因为FramePlotMethods类实现了对象调用的方法__call__(),相关的定义和函数接口和上面的SeriesPlotMethods类型的定义大致差不多,这里就不在叙述了。
本节总结
总结:通过上面的原理解释,现在明白了为什么
s.plot(kind='line') 和s.plot.line()这两者是等价的了,因为,前者的plot()是作为对象调用的,本质上plot是一个对象,而line、bar等则是类所实现的方法,当然能够通过plot对象去调用了。
总结:除了上面一些常见的基本图形以外,dataframe还可以绘制如下一些图形
Scatter Matrix
Andrews Curves
Parallel Coordinates
Lag Plot
Autocorrelation Plot
Bootstrap Plot
RadViz
具体每一种的含义这里先不讨论。
3.1
3.1.1 bar条形图
bar()函数有一个重要的参数,stacked,默认为false,表示不堆积,设置为true则表示为堆积。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df2 = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df2.plot.bar()
plt.show()
3.1.2 histogram
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df4 = pd.DataFrame({'a': np.random.randn(1000) + 1, 'b': np.random.randn(1000),'c': np.random.randn(1000) - 1}, columns=['a', 'b', 'c'])
df4.plot.hist(alpha=0.5)
plt.show()
3.1.3 box绘图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.rand(10, 5), columns=['A', 'B', 'C', 'D', 'E'])
df.plot.box()
plt.show()
3.1.4 area绘图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.rand(10, 4), columns=['a', 'b', 'c', 'd'])
df.plot.area()
plt.show()
3.1.5 Hexagonal Bin绘图
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.randn(1000, 2), columns=['a', 'b'])
df['b'] = df['b'] + np.arange(1000)
df.plot.hexbin(x='a', y='b', gridsize=25)
plt.show()
本节总结
熟练使用pandas绘图在使用pandas进行数据分析的时候非常方便。Next3.2
上面每一种绘图方法对应有一系列的参数设置,但是通过转到定义,并不能查看到究竟有哪一些参数可以设置,只得到下面这一句话:
def bar(self, **kwds):
"""
Vertical bar plot
Parameters
----------
`**kwds` : optional
Additional keyword arguments are documented in
:meth:`pandas.Series.plot`.
故而详细的参数列表究竟在哪里我还没找到,如果哪位大神世道在哪里查看每一种绘图函数的详细参数列表,望告知!
---------------------
pandas绘图功能是对matplotlib绘图的高层封装,提供了更加简单易用的绘图接口,在使用pandas进行数据分析的时候,如除了使用pandas本身自带的一些数据可视化以外,如果将pandas和matplotlib结合起来使用,将会起到更好的效果
END
往期回顾